<?php

/**
 * Permite hacer operaciones con la tabla subcalle de la base de datos
 * @package simertweb 
 * @subpackage models
 * @category Administración
 * @author Grecia Espinoza <mrcl2587@gmail.com>
 * @author Juan Maldonado  <jgmaldonadoj@gmail.com>
 * @version 1.0  
 */
class Msubcalles extends CI_Model {

    var $subCalles;

    public function __construct() {
        $this->load->database();
        $this->load->model('mzona');
        $this->load->model('mcalles');
        $this->load->model('mhistorico');
    }

    /**
     * Obtiene las subcalles que pertenecen al SIMERT
     * @return type
     */
    function listarCalles() {
        $this->db->order_by('idZona', 'asc');
        $this->db->where('uso', 1);
        $query = $this->db->get('subcalle');
        return $query->result();
    }

    /**
     * Obtiene las subcalles que pertenecen al SIMERT
     * @return type
     */
    function listar_calles() {
        $this->db->order_by('idZona', 'asc');
        $query = $this->db->get('subcalle');
        return $query->result();
    }
    /**
     * Obtiene una subcalle
     * @param type $idSubcalle es el id de subcalle
     * @return type array
     */
    function obtener_subcalle($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->result();
    }

    //retorna una lista de todas las subcalles con las zonas que les corresponde
    /**
     * Obtine las subcalles con su respectiva zona a la que pertenecen 
     * @return array
     */
    function cargarSubcalles() {
        $query = array();
        $array = $this->listar_calles();

        foreach ($array as $value) {
            $query2 = array(
                "id" => $value->idSubcalle,
                "zona" => ucfirst(strtolower($this->mzona->zona($value->idZona))),
                "principal" => ucfirst(strtolower($this->mcalles->calle($value->principal))),
                "sec1" => ucfirst(strtolower($this->mcalles->calle($value->secundaria1))),
                "sec2" => ucfirst(strtolower($this->mcalles->calle($value->secundaria2))),
                "amarillos" => $value->espAmarillos,
                "azules" => $value->espAzules,
                "orientacion" => $value->orientacion,
                "uso" => $value->uso
            );
            array_push($query, $query2);
        }
        return $query;
    }

//    /**
//     * Guarda el nombre de una calle
//     * @param type $calle es el nombre de la calle
//     */
//    function guardar($calle) {
//        $data = array('nombre' => $calle);
//        $this->db->insert('calle', $data);
//    }
//    function subcalle($subcalle) {
//        $lista = $this->db->get('subcalle');
//
//        foreach ($lista as $value) {
////            $cadena=." entre ".$value->secundaria1." y ".
////            =$value->principal." entre ".$value->secundaria1." y ".$value->secundaria2;
//
//            if (strcmp("hola", "hola") == 0) {
//                return $value;
//            } else {
//                return "";
//            }
//        }
//    }
    /**
     * Obtiene el id de la calle principal
     * @param type $idSubcalle es el id de la subcalle
     * @return type int
     */
    function idprincipal($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->row()->principal;
    }

    /**
     * Obtine el id de la calle secundaria1 o primera intersección 
     * @param type $idSubcalle es id de subcalle
     * @return type int
     */
    function idsecundaria1($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->row()->secundaria1;
    }

    /**
     * Obtine el id de la calle secundaria2 o segunda intersección 
     * @param type $idSubcalle es id de subcalle
     * @return type int
     */
    function idsecundaria2($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->row()->secundaria2;
    }

    /**
     * Obtiene la orientación de una subcalle
     * @param type $idSubcalle es el id de una subcalle
     * @return type string
     */
    function obtener_orientacion($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->row()->orientacion;
    }

    /**
     * Obtine una subcalle
     * @param type $idSubcalle es el id de subcalle
     * @return type array
     */
    function obtenerSubcalle($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $subcalle = $this->db->get('subcalle');
        return $subcalle->result();
    }

    /**
     * Obtiene el id de una subcalle tomando el cuenta el orden de las calles secunadrias
     * @param type $principal es el id de la calle principal
     * @param type $sec1 es el id de la calle secundaria1
     * @param type $sec2 es el id de la calle secundaria2
     * @param type $orientacion es la ubicaciónrientación donde se encuentran 
     * los espacios SIMERT
     * @return boolean|int
     */
    function aux_obtener_idSubcalle2($principal, $sec1, $sec2, $orientacion) {
        $this->db->where('principal', $principal);
        $this->db->where('secundaria2', $sec1);
        $this->db->where('secundaria1', $sec2);
        $this->db->where('orientacion', $orientacion);
        $this->db->where('uso', 1);
        $this->db->where('idSubcalle !=', $_POST['idSubcalle']);
        if (!isset($this->db->get('subcalle')->row()->idSubcalle)) {
            return FALSE;
        } else {
            return $this->db->get('subcalle')->row()->idSubcalle;
        }
    }

    /**
     * Obtiene el id de una subcalle tomando el cuenta el orden de las calles secunadrias
     * @param type $principal es el id de la calle principal
     * @param type $sec1 es el id de la calle secundaria1
     * @param type $sec2 es el id de la calle secundaria2
     * @param type $orientacion es la ubicaciónrientación donde se encuentran 
     * los espacios SIMERT
     * @return boolean|int
     */
    function aux_obtener_idSubcalle($principal, $sec1, $sec2, $orientacion) {
        $this->db->where('principal', $principal);
        $this->db->where('secundaria2', $sec1);
        $this->db->where('secundaria1', $sec2);
        $this->db->where('orientacion', $orientacion);
        $this->db->where('uso', 1);
        if (!isset($this->db->get('subcalle')->row()->idSubcalle)) {
            return FALSE;
        } else {
            return $this->db->get('subcalle')->row()->idSubcalle;
        }
    }

    /**
     * Obtiene el id de una subcalle sin diferenciar el orden de las calles secundarias
     * @param type $principal es el id de la calle principal
     * @param type $sec1 es el id de la calle secundaria1
     * @param type $sec2 es el id de la calle secundaria2
     * @param type $orientacion es la ubicaciónrientación donde se encuentran 
     * los espacios SIMERT
     * @return boolean|int
     */
    function obtener_idSubcalle($principal, $sec1, $sec2, $orientacion) {
        if (is_bool($this->aux_obtener_idSubcalle($principal, $sec1, $sec2, $orientacion))) {
            $this->db->where('principal', $principal);
            $this->db->where('secundaria1', $sec1);
            $this->db->where('secundaria2', $sec2);
            $this->db->where('orientacion', $orientacion);
            $this->db->where('uso', 1);
            if (!isset($this->db->get('subcalle')->row()->idSubcalle)) {
                return FALSE;
            } else {
                return $this->db->get('subcalle')->row()->idSubcalle;
            }
        } else {
            return $this->db->get('subcalle')->row()->idSubcalle;
        }
    }

    /**
     * Obtiene el id de una subcalle sin diferenciar el orden de las calles secundarias
     * @param type $principal es el id de la calle principal
     * @param type $sec1 es el id de la calle secundaria1
     * @param type $sec2 es el id de la calle secundaria2
     * @param type $orientacion es la ubicaciónrientación donde se encuentran 
     * los espacios SIMERT
     * @return boolean|int
     */
    function obtener_idSubcalle2($principal, $sec1, $sec2, $orientacion) {
        if (is_bool($this->aux_obtener_idSubcalle2($principal, $sec1, $sec2, $orientacion))) {
            $this->db->where('principal', $principal);
            $this->db->where('secundaria1', $sec1);
            $this->db->where('secundaria2', $sec2);
            $this->db->where('orientacion', $orientacion);
            $this->db->where('idSubcalle !=', $_POST['idSubcalle']);
            $this->db->where('uso', 1);
            if (!isset($this->db->get('subcalle')->row()->idSubcalle)) {
                return FALSE;
            } else {
                return $this->db->get('subcalle')->row()->idSubcalle;
            }
        } else {
            return $this->db->get('subcalle')->row()->idSubcalle;
        }
    }

    /**
     * Obtiene el id de una zona de estacionamiento
     * @param type $idSubcalle es el id de subcalle
     * @return type int
     */
    function obtenerSubcalle_idZona($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle')->row();
        return $query->idZona;
    }

    /**
     * Disminuye los espacios SIMERT y aumenta los reservados de una subcalle
     * cada vez que se crea un nuevo espacio reservado
     * @param type $idSubcalle es el id de la subcalle
     * @param type $espAmarillos es la cantidad de espacios reservados
     */
    function disminuir_azules($idSubcalle, $espAmarillos) {
        $subcalle = $this->msubcalles->obtener_subcalle($idSubcalle);
        foreach ($subcalle as $result) {
            $amarillos = $result->espAmarillos;
            $azules = $result->espAzules;
        }
        $amarillos = intval($amarillos) + intval($espAmarillos);
        $azules = intval($azules) - intval($espAmarillos);
        $data = array(
            'espAzules' => $azules,
            'espAmarillos' => $amarillos
        );
        $this->db->where('idSubcalle', $idSubcalle);
        $this->db->update('subcalle', $data);
    }

    /**
     * Aumenta los espacios SIMERT y diminuye los reservados de una subcalle cuando
     * se elimina una o varios espacios reservados
     * @param type $idSubcalle es el id de subcalle
     * @param type $espAmarillos es la cantidad de espacios reservados
     */
    function aumentar_azules($idSubcalle, $espAmarillos) {
        $subcalle = $this->msubcalles->obtener_subcalle($idSubcalle);
        foreach ($subcalle as $result) {
            $amarillos = $result->espAmarillos;
            $azules = $result->espAzules;
        }
        $amarillos = intval($amarillos) - intval($espAmarillos);
        $azules = intval($azules) + intval($espAmarillos);
        $data = array(
            'espAzules' => $azules,
            'espAmarillos' => $amarillos
        );
        $this->db->where('idSubcalle', $idSubcalle);
        $this->db->update('subcalle', $data);
    }

    /**
     * Obtiene la cantidad de espacios resrvados de una subcalle
     * @param type $idSubcalle es el id de subacalle
     * @return type int
     */
    function obtener_amarillos($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle')->row();
        return $query->espAmarillos;
    }

    /**
     * Obtiene la cantidad de espacios SIMERT de una subcalle
     * @param type $idSubcalle es el id de subcalle
     * @return type int
     */
    
    function obtener_azules($idSubcalle) {
        $this->db->where('idSubcalle', $idSubcalle);
        $query = $this->db->get('subcalle');
        return $query->row()->espAzules;
    }

    /**
     * Obtiene las subcalles que se encuentran en uso
     * @return array
     */
    function obtener_subcalles() {
        $reservados = array();
        $this->db->where('uso', 1);
        $query = $this->db->get('subcalle')->result();

        foreach ($query as $value) {
            $data = array(
                'idsubcalle' => $value->idSubcalle,
                'subcalle' => $this->mcalles->calle($this->msubcalles->idprincipal($value->idSubcalle)) .
                " ENTRE " . $this->mcalles->calle($this->msubcalles->idsecundaria1($value->idSubcalle)) .
                " Y " . $this->mcalles->calle($this->msubcalles->idsecundaria2($value->idSubcalle)) .
                "(" . $value->orientacion . ")",
            );
            array_push($reservados, $data);
        }
        return $reservados;
    }

    /**
     * Obtiene una lista de subcalles con la zona a la que pertencen y las calles 
     * que la conforman
     * @return type array
     */
    function obtener_subcalles_zona() {
        $this->db->where('idSubcalle', $_POST['modificar']);
        $query = $this->db->get('subcalle')->row();
        $data = array(
            'idsubcalle' => $query->idSubcalle,
            'zona' => $this->mzona->zona($query->idZona),
            'principal' => $this->mcalles->calle($this->idprincipal($query->idSubcalle)),
            'sec1' => $this->mcalles->calle($this->idsecundaria1($query->idSubcalle)),
            'sec2' => $this->mcalles->calle($this->idsecundaria2($query->idSubcalle)),
            'X1' => $query->X1,
            'X2' => $query->X2,
            'Y1' => $query->Y1,
            'Y2' => $query->Y2,
            'orientacion' => $query->orientacion,
            'espacios' => $query->espAmarillos + $query->espAzules,
            'habilitado' => $query->uso,
        );
        return $data;
    }

    /**
     * Actualiza la información de una subcalle
     */
    function actualizar_subcalle() {
        if (!isset($_POST['habilitado'])) {
            $habilitado = 0;
        } else {
            $habilitado = 1;
        }
        $data = array(//obtiene los datos del formulario y los almacena en las variables  
            'principal' => $this->mcalles->indice($_POST['calle']), //obtiene el id de la calle
            'secundaria1' => $this->mcalles->indice($_POST['sec_1']), //obtiene el id de la calle
            'X1' => $_POST['lon_1'],
            'Y1' => strtoupper($_POST['lat_1']),
            'secundaria2' => $this->mcalles->indice($_POST['sec_2']), //obtiene el id de la calle
            'X2' => strtolower($_POST['lon_2']),
            'Y2' => strtoupper($_POST['lat_2']),
            'espAzules' => $_POST['azules'] - $this->obtener_amarillos($_POST['idSubcalle']),
            'orientacion' => $_POST['orientacion'],
            'idZona' => $this->mzona->indice($_POST["zona"]), //obtiene el id de la zona
            'uso' => $habilitado
        );
        $this->db->where('idSubcalle', $_POST['idSubcalle']);
        $this->db->update('subcalle', $data);
        $this->mhistorico->guardar_acceso($_POST['idSubcalle'], "Modificación de una zona de trabajo");
    }

    /**
     * Inhabilita el uso de una subcalle
     */
    function eliminar_subcalle() {
        $data = array(//obtiene los datos del formulario y los almacena en las variables  
            'uso' => 0,
        );
        $this->db->where('idSubcalle', $_POST['lista']);
        $this->db->update('subcalle', $data);
        $this->mhistorico->guardar_acceso($_POST['lista'], "Eliminación logica de una zona de trabajo");
    }
    
    }

?>
